package com.moli.iov.down.command.mq;

import com.moli.iov.down.constants.Constant;
import com.moli.iov.down.enums.SendFactoryEnum;
import com.moli.iov.down.model.dto.remoting.CommandDto;
import com.moli.iov.down.command.design.decorator.AbstractSendCommand;
import com.moli.iov.down.command.design.factory.SendFactory;
import com.moli.iov.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * <p>
 *  下发命令 入口
 * </p>
 *
 * @author: zql
 * @Date: 2018/12/28 15:56
 */
@Slf4j
@Component("sendHandle")
public class SendHandle {

    /**
     * 发送命令
     * @param commandDto
     * @param allData
     */
    public void send(CommandDto commandDto, byte[] allData){
        log.info("[下行报文] 入口  入参：{}, allData：{}", commandDto, StringUtil.bytesToHexString(allData));

        //kafka 发送命令
        AbstractSendCommand aSendCommand = SendFactory.get(SendFactoryEnum.KAFKA.getFlag(), null);

        //发送ActiveMQ
        aSendCommand = SendFactory.get(SendFactoryEnum.ACTIVEMQ.getFlag(), aSendCommand);

        //添加缓存
        aSendCommand = SendFactory.get(SendFactoryEnum.CACHE.getFlag(), aSendCommand);

        aSendCommand.sendCommand(commandDto, allData);
    }

    /**
     * 补发命令
     * @param commandDto
     * @param allData
     */
    public void retrySend(CommandDto commandDto, byte[] allData){
        log.info("[补发命令] 入口  入参：{}, allData：{}", commandDto, StringUtil.bytesToHexString(allData));

        //装饰者
        AbstractSendCommand aSendCommand = SendFactory.get(SendFactoryEnum.KAFKA.getFlag(), null);

        //发送ActiveMQ
        aSendCommand = SendFactory.get(SendFactoryEnum.ACTIVEMQ.getFlag(), aSendCommand);

        aSendCommand.sendCommand(commandDto, allData);
    }

    /**
     * 应答发送
     * @param vin
     * @param allData
     */
    public void sendResponse(String vin, byte[] allData){
        CommandDto commandDto = new CommandDto();
        commandDto.setVin(vin);
        commandDto.setCommand(allData[Constant.COMMAND_INDEX]);

        AbstractSendCommand aSendCommand = SendFactory.get(SendFactoryEnum.KAFKA.getFlag(), null);
        aSendCommand.sendCommand(commandDto, allData);
    }
}
